home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / source / graphicgems4.lha / GemsIV / outcode / xf3.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-02-06  |  1.7 KB  |  78 lines

  1. /* 2D transform and clip test a vertex list */
  2.  
  3. /* oflo and division traps should be disabled, by the way */
  4.  
  5. #define FI(x)    (*(int *)&x)
  6.  
  7. /********************************************************/
  8. xform_ctp(vc, vpi, vpo, visiz, vosiz, mtx, prj, pf, pa)
  9. int vc    ;    /* vertex count */
  10. int visiz;    /* input vertex array stride */
  11. int vosiz;    /* output vertex array stride */
  12. int *pf;    /* flag array */
  13. int *pa;    /* 2 element - global or_flag, and_flag */
  14. float *vpi, *vpo, *mtx, *prj;
  15. {
  16. register int flag, flag_or, flag_and;
  17. register int sign = 0x80000000;
  18.  
  19. /* flpt registers, total 32 */
  20. register float xx, xy, xt;    /* transformation matrix */
  21. register float yx, yy, yt;
  22. float xo, yo;        /* output vertex */
  23. register float xi, yi;        /* temps */
  24.  
  25. register int ixmin, ixmax, iymin, iymax;
  26. register int ix, ax;
  27.  
  28. #define XMIN    0
  29. #define XMAX    1279
  30. #define YMIN    0
  31. #define YMAX    1023
  32.  
  33. float xmin = XMIN, ymin = YMIN, xmax = XMAX, ymax = YMAX;
  34.  
  35. /* load up local transform matrix */
  36. xx = *(mtx+0 ); xy = *(mtx+1 ); xt = *(mtx+2 );
  37. yx = *(mtx+4 ); yy = *(mtx+5 ); yt = *(mtx+6 );
  38.  
  39. /* initialize accumulated flags */
  40. flag_or = 0;
  41. flag_and = -1;
  42.  
  43. ixmin = FI(xmin); iymin = FI(ymin);
  44. ixmax = FI(xmax); iymax = FI(ymax);
  45.  
  46. do {
  47.     xi = vpi[0];    /* xi */
  48.     yi = vpi[1];    /* yi */
  49.  
  50.     xo = xi * xx + yi * xy + xt;
  51.     yo = xi * yx + yi * yy + yt;
  52.  
  53.     ix = FI(xo); ax = ix & ~sign;
  54.     flag = (ix | (ax - ixmin)) >> 31;
  55.     flag |= ((~ix & (ixmax - ax)) >> 31 ) << 1;
  56.  
  57.     ix = FI(yo); ax = ix & ~sign;
  58.     flag = ((ix | (ax - iymin)) >> 31) << 2;
  59.     flag |= ((~ix & (iymax - ax)) >> 31 ) << 3;
  60.  
  61.     flag_or |= flag;
  62.     flag_and &= flag;
  63.  
  64.     *(vpo+0) = xo;
  65.     *(vpo+1) = yo;
  66.     *pf = flag;
  67.  
  68.     vpi += visiz;
  69.     vpo += vosiz;
  70.     pf++;
  71. } while (--vc > 0);
  72.  
  73. *(pa+0) = flag_or;
  74. *(pa+1) = flag_and;
  75.  
  76. return;
  77. }
  78.